// 加密解密服务
import CryptoJS from 'crypto-js';

// 加密密钥和向量，与Python后端保持一致
const SECRET_KEY = 'your-secret-key1';
const SECRET_IV = 'your-iv-vector12';

// 创建加密配置
const getKeyAndIV = () => {
  const key = CryptoJS.enc.Utf8.parse(SECRET_KEY);
  const iv = CryptoJS.enc.Utf8.parse(SECRET_IV);
  return { key, iv };
};

/**
 * AES加密 - 与Python后端兼容的实现
 * @param {string|object} data - 要加密的数据
 * @returns {string} - 加密后的字符串
 */
export const encrypt = (data) => {
  try {
    const { key, iv } = getKeyAndIV();

    // 如果是对象，先转为JSON字符串
    const dataStr = typeof data === 'object' ? JSON.stringify(data) : String(data);

    // 使用AES/CBC/PKCS7进行加密
    const encrypted = CryptoJS.AES.encrypt(dataStr, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 返回Base64编码的加密字符串
    return encrypted.toString();
  } catch (error) {
    console.error('加密失败:', error);
    return '';
  }
};

/**
 * AES解密 - 与Python后端兼容的实现
 * @param {string} encryptedStr - 加密的字符串
 * @returns {string|object} - 解密后的数据
 */
export const decrypt = (encryptedStr) => {
  try {
    const { key, iv } = getKeyAndIV();

    // 解密
    const decrypted = CryptoJS.AES.decrypt(encryptedStr, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7,
    });

    // 转换为UTF-8字符串
    const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8);

    // 返回解密后的字符串，不自动解析JSON
    // 因为Python测试代码中是先解密得到字符串，然后手动解析JSON
    return decryptedStr;
  } catch (error) {
    console.error('解密失败:', error);
    return null;
  }
};

/**
 * 计算数据的哈希值，用于完整性校验
 * @param {string} data - 要计算哈希的数据
 * @returns {string} - 哈希值
 */
export const calculateHash = (data) => {
  return CryptoJS.SHA256(data).toString();
};

/**
 * 验证数据完整性
 * @param {string} data - 原始数据
 * @param {string} hash - 哈希值
 * @returns {boolean} - 是否一致
 */
export const verifyIntegrity = (data, hash) => {
  const calculatedHash = calculateHash(data);
  return calculatedHash === hash;
};
